﻿// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

namespace Neto.Web;

/// <summary>
///     http 信息
/// </summary>
public class WebHttpInfo
{
    /// <summary>
    ///     请求信息
    /// </summary>
    public WebHttpInfo_Request Request { get; set; } = new();

    /// <summary>
    ///     响应信息
    /// </summary>
    public WebHttpInfo_Response Response { get; set; } = new();

    /// <summary>
    ///     连接信息
    /// </summary>
    public WebHttpInfo_Connection Connection { get; set; } = new();

    /// <summary>
    ///     请求扩展信息
    /// </summary>
    public WebHttpInfo_RequestEx RequestEx { get; set; } = new();

    /// <summary>
    ///     服务器信息
    /// </summary>
    public WEbHttpInfo_ServerInfo ServerInfo { get; set; } = new();

    /// <summary>
    ///     生成并返回一个基于用户请求的唯一指纹字符串。
    /// </summary>
    /// <returns>返回一个表示用户独特特征的SHA256加密字符串。</returns>
    public string GenerateUserFingerprint()
    {
        // 创建一个匿名对象，包含用户的 userAgent、屏幕分辨率、操作系统和IP地址信息
        var fingerprint = new
        {
            RequestEx.UserAgent,
            RequestEx.ScreenWidth,
            RequestEx.ScreenHeight,
            OS = RequestEx.Os,
            IPAddress = RequestEx.RemoteIPv4
        };

        // 将指纹对象转换为JSON字符串，然后将该字符串进行SHA256加密
        return fingerprint.ToJson().ToSha256();
    }
}

/// <summary>
///     http 提交
/// </summary>
public class WebHttpInfo_Request
{
    /// <summary>
    ///     获取或设置请求内容的长度。
    /// </summary>
    public long? ContentLength { get; set; }

    /// <summary>
    ///     获取或设置请求内容的类型。
    /// </summary>
    public string ContentType { get; set; }

    // 已注释的属性表示这些功能当前未使用或未实现。
    //public string ContentEncoding { get; set; }
    //public string ContentLanguage { get; set; } = string.Empty;
    //public string ContentLanguageVersion { get; set; } = string.Empty;

    /// <summary>
    ///     获取或设置请求中的Cookie字符串。
    /// </summary>
    public string Cookies { get; set; }

    /// <summary>
    ///     获取或设置表单数据的字符串表示。
    /// </summary>
    public string Form { get; set; }

    /// <summary>
    ///     获取或设置一个值，指示请求是否包含表单内容类型。
    /// </summary>
    public bool HasFormContentType { get; set; }

    /// <summary>
    ///     获取或设置请求头信息的字符串表示。
    /// </summary>
    public string Headers { get; set; }

    /// <summary>
    ///     获取或设置请求的主机名。
    /// </summary>
    public string Host { get; set; }

    /// <summary>
    ///     获取或设置一个值，指示请求是否使用HTTPS。
    /// </summary>
    public bool IsHttps { get; set; }

    /// <summary>
    ///     获取或设置请求的方法（例如GET、POST）。
    /// </summary>
    public string Method { get; set; }

    /// <summary>
    ///     获取或设置请求的路径。
    /// </summary>
    public string Path { get; set; }

    /// <summary>
    ///     获取或设置请求的基础路径。
    /// </summary>
    public string PathBase { get; set; }

    /// <summary>
    ///     获取或设置请求的协议（例如HTTP/1.1）。
    /// </summary>
    public string Protocol { get; set; }

    // 查询字符串已通过QueryString属性处理，下面的注释说明了这一选择。
    //public string Query { get; set; }

    /// <summary>
    ///     获取或设置请求的查询字符串。
    /// </summary>
    public string QueryString { get; set; }

    /// <summary>
    ///     获取或设置路由值的字符串表示。
    /// </summary>
    public string RouteValues { get; set; }

    /// <summary>
    ///     获取或设置请求的方案（例如http、https）。
    /// </summary>
    public string Scheme { get; set; }
}

/// <summary>
///     Http  返回
/// </summary>
public class WebHttpInfo_Response
{
    /// <summary>
    ///     获取一个值，该值指示是否已将响应标头发送到客户端。
    /// </summary>
    public bool HasStarted { get; set; }

    /// <summary>
    ///     获取或设置Content-Type响应标头的值
    /// </summary>
    public string? ContentType { get; set; }

    /// <summary>
    ///     获取或设置Content-Length响应标头的值。
    /// </summary>
    public long? ContentLength { get; set; }

    /// <summary>
    ///     获取或设置HTTP响应代码。
    /// </summary>
    public int StatusCode { get; set; }

    /// <summary>
    ///     响应的Cookie。
    /// </summary>
    public string Cookies { get; set; }
}

/// <summary>
///     Http 连接
/// </summary>
public class WebHttpInfo_Connection
{
    /// <summary>
    ///     用于表示此连接的唯一标识符
    /// </summary>
    public string Id { get; set; }

    /// <summary>
    ///     远程目标的IP地址。可以为null
    /// </summary>
    public string RemoteIpAddress { get; set; }

    /// <summary>
    ///     远程目标的端口
    /// </summary>
    public int RemotePort { get; set; }

    /// <summary>
    ///     本地主机的IP地址
    /// </summary>
    public string LocalIpAddress { get; set; }

    /// <summary>
    ///     本地主机的端口
    /// </summary>
    public int LocalPort { get; set; }

    /// <summary>
    ///     客户端证书
    /// </summary>
    public string ClientCertificate { get; set; }
}

/// <summary>
///     http 提交扩展信息
/// </summary>
public class WebHttpInfo_RequestEx
{
    /// <summary>
    ///     远程IP V4地址
    /// </summary>
    public string RemoteIPv4 { get; set; }

    /// <summary>
    ///     远程IP V6地址
    /// </summary>
    public string RemoteIPv6 { get; set; }

    /// <summary>
    ///     本地IP V4地址
    /// </summary>
    public string LocalIPv4 { get; set; }

    /// <summary>
    ///     本地IP V6地址
    /// </summary>
    public string LocalIPv6 { get; set; }

    /// <summary>
    ///     请求地址
    /// </summary>
    public string RequestUrl { get; set; }

    /// <summary>
    ///     来源 Url 地址
    /// </summary>
    public string RefererUrl { get; set; }

    ///// <summary>
    ///// URL 参数
    ///// </summary>
    //public string UrlParams { get; set; }

    ///// <summary>
    ///// 请求参数
    ///// </summary>
    //public string Params { get; set; }

    ///// <summary>
    ///// 请求头
    ///// </summary>
    //public string Header { get; set; }

    ///// <summary>
    ///// 内容类型
    ///// </summary>
    //public string ContentType { get; set; }

    /// <summary>
    ///     区域
    /// </summary>
    public string AreaName { get; set; }

    /// <summary>
    ///     控制器
    /// </summary>
    public string ControllerName { get; set; }

    /// <summary>
    ///     功能
    /// </summary>
    public string ActionName { get; set; }

    /// <summary>
    ///     系统
    /// </summary>
    public string Os { get; set; }

    /// <summary>
    ///     浏览器
    /// </summary>
    public string Browser { get; set; }

    /// <summary>
    ///     设备
    /// </summary>
    public string Device { get; set; }

    /// <summary>
    ///     客户端浏览器信息
    /// </summary>
    public string UserAgent { get; set; }

    /// <summary>
    ///     客户端请求区域语言
    /// </summary>
    public string AcceptLanguage { get; set; }

    /// <summary>
    ///     请求来源（swagger还是其他）
    /// </summary>
    public string RequestFrom { get; set; }

    /// <summary>
    ///     获取响应头信息 授权Token
    /// </summary>
    public string AccessToken { get; set; }

    /// <summary>
    ///     授权信息
    /// </summary>
    public string Authorization { get; set; }

    /// <summary>
    ///     获取响应 cookies 信息
    /// </summary>
    public string ResponseHeaderCookies { get; set; }

    /// <summary>
    ///     屏幕宽度
    /// </summary>
    public string ScreenWidth { get; set; }

    /// <summary>
    ///     屏幕高度
    /// </summary>
    public string ScreenHeight { get; set; }
}

/// <summary>
///     服务器信息
/// </summary>
public class WEbHttpInfo_ServerInfo
{
    /// <summary>
    ///     获取启动信息
    /// </summary>
    public string EntryAssemblyName { get; set; }

    /// <summary>
    ///     获取进程信息
    /// </summary>
    public string ProcessName { get; set; }

    /// <summary>
    ///     获取部署程序
    /// </summary>
    public string DeployServer { get; set; }

    /// <summary>
    ///     服务器环境
    /// </summary>
    public string Environment { get; set; }

    #region 系统信息

    /// <summary>
    ///     操作系统的描述信息
    /// </summary>
    public string osDescription { get; set; }

    /// <summary>
    ///     操作系统的架构信息（例如：x86, x64）
    /// </summary>
    public string osArchitecture { get; set; }

    /// <summary>
    ///     .NET框架的描述信息
    /// </summary>
    public string frameworkDescription { get; set; }

    /// <summary>
    ///     基础框架的名称
    /// </summary>
    public string basicFramework { get; set; }

    /// <summary>
    ///     基础框架的版本号
    /// </summary>
    public string basicFrameworkVersion { get; set; }

    #endregion 系统信息
}